Så jag utvecklar ett socialt spel där du har en viss tid att göra en uppgift. Eftersom det är socialt kan du chatta med den andra spelaren. Varje gång du får ett chattmeddelande får du också ett meddelande och när du klickar på det omdirigeras du till chattskärmen med honom. Just nu fungerar det bra. Vad jag inte vill är att användaren får ett chattmeddelande medan han faktiskt spelar på PlayActivity. Det skulle också vara bra om anmälan som redan visats kunde ignoreras eller avbrytas till en senare tid medan han är på PlayActivity. Är detta möjligt? Ett annat tillvägagångssätt kan vara att avbryta alla redan visade meddelanden och sätta BroadcastReceiver i viloläge och återuppliva alla meddelanden och BroadcastReceiver när PlayActivity är klar? Inte heller möjligt? Kan appen åtminstone fråga innan den lämnar aktiviteten? på det sättet kunde jag varna honom och om han fortfarande lämnar kan spelet värderas mot honom. Vad jag gör just nu är bara en lösning, jag gör PlayActivity i helskärm och kontrollerar om fokus har förändrats t.ex. om han drar ner statusfältet / meddelandefältet. Men det här är bara ett hack, något jag verkligen skulle vilja göra bort med. Som ni ser är jag inte riktigt säker på vad rätt tillvägagångssätt här kan vara. Vad skulle en pro-utvecklare av Android-programvara göra i mitt fall? Tack på förhand! Just nu hanterar jag aviseringar genom att utöka en BroadcastReceiver. Koden läggs till i slutet, om du behöver andra delar av min kod, låt mig veta! offentlig klass PushBroadcastReceiver utökar BroadcastReceiver { @Åsidosätta public void onReceive (Kontextkontext, avsikt avsikt) { Prova { JSONObject json = nya JSONObject ( intention.getExtras () .getString ("KEY")); meddela (sammanhang, avsikt, json); } fånga (JSONException e) { L.debug (App.TAG, "JSONException:" + e.getMessage ()); } } privat ogiltigt meddelande (Context ctx, Intent i, JSONObject dataObject) kastar JSONException { NotificationManager nm = (NotificationManager) ctx.getSystemService (Context.NOTIFICATION_SERVICE); boolean createNotification = false; PendingIntent pi = null; int gameId = 0; // chatt om (dataObject.getString ("KEY_CHAT"). är lika med ("VALUE_CHAT")) { Intent intention = new Intent (ctx, ChatActivity.class); intention.putExtra ("opponentUsername", dataObject.getString (PARSE_JSON_OPPONENT_USERNAME_KEY)); intention.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY)); pi = PendingIntent.getActivity (ctx, 0, intention, PendingIntent.FLAG_UPDATE_CURRENT); gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY)); createNotification = true; // spel } annat om (dataObject.getString ("KEY_GAME"). är lika med ("VALUE_GAME")) { Intent intention = new Intent (ctx, SS6RunningGameActivity.class); intention.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY)); gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY)); pi = PendingIntent.getActivity (ctx, 0, intention, PendingIntent.FLAG_UPDATE_CURRENT); createNotification = true; } om (createNotification) { Uri-ljud = Uri.parse ("android.resource: //" + ctx.getPackageName () + "/" + R.raw.push_notif); int-ikon = R.drawable.icon_notification_android; Sträng tickerText = dataObject.getString ("TEXT"); Meddelande mNotification = ny NotificationCompat.Builder (ctx) .setContentTitle (ctx.getResources (). getString (R.string.app_name)) .setContentText (tickerText) .setSmallIcon (ikon) .setContentIntent (pi) .setSound (ljud) .setDefaults (Meddelande.DEFAULT_VIBRATE) .setAutoCancel (sant) .setStyle (ny NotificationCompat.BigTextStyle () .bigText (tickerText)) .bygga(); nm.notify (gameId, mNotification); } }
2021-02-05 08:17:21
Det kan finnas många tillvägagångssätt för detta. En av de enklaste skulle vara följande: Använd SharedPreferences. Lägg till ett booleskt värde för att indikera att PlayActivity för närvarande körs. Gör följande i onCreate (Bundle) av PlayActivity: // Initiering SharedPreferences preferenser = getSharedPreferences ("MY_PREF_FILE_NAME", 0); Editor redigera = preferenser.edit (); // Här är "PLAY_ACTIVITY_IS_RUNNING" "nyckeln" och "sant" är värdet // Vi säger att 'PlayActivity' körs edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", sant); edit.commit (); Nu, i onPause () för PlayActivity, ställer du in den här booleska till falsk - vilket indikerar att vi håller på att lämna PlayActivity: // Initiering SharedPreferences preferenser = getSharedPreferences ("MY_PREF_FILE_NAME", 0); Editor redigera = preferenser.edit (); // Här är "PLAY_ACTIVITY_IS_RUNNING" "nyckeln" och "falsk" är värdet // Vi säger att 'PlayActivity' inte körs längre edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", falskt); edit.commit (); Vila är ganska enkelt. I PushBroadcastReceiver öppnar du SharedPreferences och söker efter det värde som tilldelats tangenten PLAY_ACTIVITY_IS_RUNNING. Om detta värde är falskt, fortsätt att skicka meddelandena. Annars, samla dem för senare. offentlig klass PushBroadcastReceiver utökar BroadcastReceiver { @Åsidosätta public void onReceive (Kontextkontext, avsikt avsikt) { SharedPreferences preferenser = context.getSharedPreferences ( "MY_PREF_FILE_NAME", 0); // Hämta värdet som sparats för nyckeln "PLAY_ACTIVITY_IS_RUNNING" // Det andra argumentet "false" är standardvärdet // om nyckeln inte finns - detta är logiskt sund boolean playActivityIsRunning = preferenser.getBoolean ( "PLAY_ACTIVITY_IS_RUNNING", falskt) // PlayActivity körs if (playActivityIsRunning) { // lagra JSON-objekt någonstans och hantera dem senare } annat { Prova { JSONObject json = ny JSONObject (intention.getExtras (). GetString ("KEY")); meddela (sammanhang, avsikt, json); } fånga (JSONException e) { L.debug (App.TAG, "JSONException:" + e.getMessage ()); } } } privat ogiltigt meddelande (Context ctx, Intent i, JSONObject dataObject) kastar JSONException { .... .... } } Du måste hitta ett sätt att lägga upp de väntande aviseringarna. En lösning för detta är att skicka en separat sändning till en annan BroadcastReceiver i onPause () för PlayActivity. Men detta kan vara problematiskt eftersom onPause () anropas även när användaren ändrar orientering. Kanske kan denna BroadcastReceiver börja arbeta efter 1 sekunders fördröjning? Detta skulle vara tillräcklig tid för att aktiviteten ska återskapas - och värdet för PLAY_ACTIVITY_IS_RUNNING återställs (eftersom onCreate (Bundle) av PlayActivity kommer att anropas igen). Så, flödet skulle vara: onPause kallas ställ in värdet till false i SharedPreferences skicka sändningen för att hantera pågående meddelanden placera koden för BroadcastReceiver inuti en Runnable. Lägg upp detta Runnable med en sekundfördröjning med en Handler. inuti BroadcastReciever => kontrollera värdet för PLAY_ACTIVITY_IS_RUNNING i SharedPreferences <= detta kommer att göras efter 1 sekund. Om användaren bara ändrade skärmorientering skulle värdet PLAY_ACTIVITY_IS_RUNNING vara sant. Annars, om användaren navigeras bort från PlayActivity, skulle värdet vara falskt. 7 | Ditt svar StackExchange.ifUsing ("redaktör", funktion () { StackExchange.using ("externalEditor", funktion () { StackExchange.using ("snippets", function () { StackExchange.snippets.init (); }); }); }, "kodutdrag"); StackExchange.ready (funktion () { var channelOptions = { taggar: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", funktion () { // Måste aktivera redaktören efter utdrag, om utdrag aktiverat if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("snippets", function () { createEditor (); }); } annat { createEditor (); } }); funktion createEditor () { StackExchange.prepareEditor ({ useStacksEditor: falsk, heartbeatType: 'answer', autoActivateHeartbeat: false, convertImagesToLinks: true, noModals: sant, showLowRepImageUploadWarning: true, reputToPostImages: 10, bindNavPrevention: true, postfix: "", imageUploader: { brandingHtml: "Drivs av \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.72543 4.916.56 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.42 12.6 12.637.0451 14.0484C39.9723 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 104521 4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \" M25.6622 17.6335 C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.949789.53 C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983.283.228 349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335Z24 C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.9512C16.8045 13.2535 17.2637 13.8962 18.2965.380 13.82 13.896 13.82 12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.9466 5.5079C7.583146 4.6666 9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10. 893 7.58817 10.893 8.94108V11.9512C10.893 13.2535 11.3711 13.8962 12.4044 13.8962C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.911791116 d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85775 13.89613.296 \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 1.829" "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Användarbidrag licensierade under \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (content policy) \ u003c / a \ u003e", allowUrls: sant }, onDemand: sant, discardSelector: ".discard-answer" , direktShowMarkdownHelp: true, enableTables: true, enableSnippets: true }); } }); Tack för att du bidrog med ett svar till Stack Overflow! Var noga med att svara på frågan. Ge detaljer och dela din forskning! Men undvik ... Be om hjälp, förtydligande eller svara på andra svar. Att göra uttalanden baserade på åsikt; säkerhetskopiera dem med referenser eller personlig erfarenhet. För att lära dig mer, se våra tips för att skriva bra svar. Utkast sparat Utkast kasseras Registrera dig eller logga in StackExchange.ready (funktion () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Registrera dig med Google Registrera dig med Facebook Registrera dig med e-post och lösenord Skicka in Lägg upp som gäst namn E-post Obligatoriskt men aldrig visat StackExchange.ready ( funktion () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f25114521% 2fis-it-possible-to-suspend-already-shown-and-new-notifications- för-ett-belopp-av% 23new-answer ',' question_page '); } ); Lägg upp som gäst namn E-post Obligatoriskt men aldrig visat Lägg upp ditt svar Kassera Genom att klicka på “Lägg upp ditt svar” godkänner du våra användarvillkor, sekretesspolicy och cookiepolicy Inte svaret du letar efter? Bläddra bland andra frågor som taggats med Android-meddelanden, tryck eller ställ din egen fråga.